#ifndef POINT_H
#define POINT_H

#include <QtOpenGL>
#include "boost/serialization/serialization.hpp"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

/*
 *  @autheur : LEMOUEL Florian
 *  @date : 25.03.2013
 *  @version 1.0 : création de la classe complète
 *  @version 1.1 : ajout de la sérialisation
 */

/*
 * Classe représentant un point en 3D
 *
 */
class Point
{

    //--------------------- Constructeurs et destructeur -------------------
public:

    //Constructeur par défault
    Point();

    //Constructeur à 3 paramètres
    Point(GLfloat x, GLfloat y, GLfloat z);

    //Constructeur à partir d'un point
    Point(const Point& p);

    //Destructeur du point
    ~Point();
    //----------------------------------------------------------------------
    //--------------------- Méthodes ---------------------------------------
public:
    //On renvoie une copie du point courant
    Point* cloner();
    //----------------------------------------------------------------------

    //--------------------- Accesseurs -------------------------------------
public:

    //On renvoie la coordonnée en x
    GLfloat getX();

    //On renvoie la coordonnée en y
    GLfloat getY();

    //On renvoie la coordonnée en z
    GLfloat getZ();

    //On affecte x
    void setX(GLfloat x);

    //On affecte y
    void setY(GLfloat y);

    //On affecte z
    void setZ(GLfloat z);

    //----------------------------------------------------------------------
    //--------------------- Surcharge des opérateurs -----------------------
public:

    //On surcharge l'opérateur +=
    void operator+=(const Point& p);

    //On surcharge l'opérateur /=
    Point& operator/=(const Point &pt2);

    //----------------------------------------------------------------------
    //--------------------- Attributs --------------------------------------
protected:

    //Coordonnées du point
    GLfloat _x;
    GLfloat _y;
    GLfloat _z;
    //----------------------------------------------------------------------
    //--------------------- Sérialisation ----------------------------------
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
            ar & _x;
            ar & _y;
            ar & _z;
    }
   //----------------------------------------------------------------------
};


#endif // POINT_H
